// 文件：utils/pdfProcessor.js
const { spawn } = require('child_process');
const path = require('path');

// Python 解释器路径（根据你的实际环境修改）
const pythonPath = 'C:/Users/admin/.conda/envs/jiaoben/python.exe';

/**
 * 调用 Python 脚本处理指定文件夹中的 PDF 文件，并返回处理结果的 Promise
 * @param {string} key - PDF 文件夹名称，比如 'cell'
 * @returns {Promise<Object>} - 返回 Python 脚本的标准 JSON 结构，如：
 * {
 *   status: "completed",
 *   total_files: 8,
 *   success_count: 8,
 *   ...
 * }
 */
const pdfOutIamges = (key) => {
  return new Promise((resolve, reject) => {
    const pythonScriptPath = path.join(__dirname, '../pythons/extract_pdf_images.py'); // 根据你的实际路径调整
    const inputUrl = '../uploads/pdf/' + key;
    const outputUrl = '../uploads/img/' + key;

    const inputFolder = path.join(__dirname, inputUrl); // 输入文件夹绝对路径
    const outputRoot = path.join(__dirname, outputUrl); // 输出文件夹绝对路径

    console.log('[服务端] 输入文件夹:', inputFolder);
    console.log('[服务端] 输出文件夹:', outputRoot);

    const args = [
      pythonScriptPath,
      inputFolder,
      outputRoot
    ];
    const pythonProcess = spawn(pythonPath, args);

    let stdoutData = '';
    let stderrData = '';

    pythonProcess.stdout.on('data', (data) => {
      stdoutData += data.toString();
    });

    pythonProcess.stderr.on('data', (data) => {
      stderrData += data.toString();
    });

    pythonProcess.on('close', (code) => {
      if (code !== 0) {
        console.error('❌ Python 脚本执行失败，退出码:', code);
        console.error('错误输出:', stderrData);
        return reject(new Error(`Python 执行失败: ${stderrData}`));
      }

      try {
        const result = JSON.parse(stdoutData);
        console.log('✅ Python 返回结果:', result);
        resolve(result); // 返回 Python 的结构化 JSON 数据
      } catch (e) {
        console.error('❌ 无法解析 Python 返回的 JSON，原始输出:', stdoutData);
        reject(new Error('Python 返回了无效的 JSON'));
      }
    });
  });
};



/**
 * 调用 Python 脚本爬取 Nature 文章并下载 PDF
 * @returns {Promise<Object>} 包含结果信息的对象
 */
const getNatureData = () => {

  // ✅ 1. 正确设置 Python 解释器路径（你已提供）
  const PYTHON_PATH = 'C:/Users/admin/.conda/envs/jiaoben/python.exe';

  // ✅ 2. 设置要调用的 Python 脚本路径（根据你的项目结构调整）
  // 假设你的 Python 脚本在项目根目录下的 pythons/ 文件夹中
  const PYTHON_SCRIPT_PATH = path.join(__dirname, '../pythons/get_nature_pdf.py');

  // 检查脚本文件是否存在，避免路径错误
  if (!fs.existsSync(PYTHON_SCRIPT_PATH)) {
    console.error(`❌ Python 脚本未找到: ${PYTHON_SCRIPT_PATH}`);
  }

  return new Promise((resolve, reject) => {
    // ✅ 检查 Python 脚本是否存在
    if (!fs.existsSync(PYTHON_SCRIPT_PATH)) {
      return reject(new Error(`Python script not found at: ${PYTHON_SCRIPT_PATH}`));
    }

    // ✅ 启动子进程
    const pythonProcess = spawn(PYTHON_PATH, [PYTHON_SCRIPT_PATH], {
      stdio: ['ignore', 'pipe', 'pipe'], // 忽略 stdin，捕获 stdout/stderr
      shell: true, // Windows 必须为 true，否则可能找不到命令
      cwd: path.dirname(PYTHON_SCRIPT_PATH) // 设置工作目录为脚本所在目录
    });

    let stdoutData = '';
    let stderrData = '';

    // ✅ 捕获标准输出（用于日志或结果传递）
    pythonProcess.stdout.on('data', (data) => {
      const output = data.toString();
      console.log('[Python Output] ', output.trim());
      stdoutData += output;
    });

    // ✅ 捕获错误输出
    pythonProcess.stderr.on('data', (data) => {
      const errorOutput = data.toString();
      console.error('[Python Error] ', errorOutput.trim());
      stderrData += errorOutput;
    });

    // ✅ 子进程关闭（最终事件）
    pythonProcess.on('close', (code) => {
      if (code === 0) {
        try {
          const result = JSON.parse(stdoutData.trim());
          console.log('📊 爬取结果:', result);
          resolve(result);
        } catch (e) {
          reject(new Error('Invalid JSON output from Python script'));
        }
      } else {
        reject(new Error(`Script failed with code ${code}: ${stderrData}`));
      }
    });

    // ✅ 处理进程启动错误（如路径错误、权限问题）
    pythonProcess.on('error', (err) => {
      console.error('❌ 启动 Python 进程失败:', err);
      reject(err);
    });
  });
};
module.exports = {
  pdfOutIamges, getNatureData
};